package com.test.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

public class GenericEncodingFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 处理response的字符编码
        HttpServletResponse myResponse=(HttpServletResponse) response;
        myResponse.setContentType("text/html;charset=UTF-8");
        // 转型为与协议相关对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        // 对request包装增强
        HttpServletRequest myrequest = new MyRequest(httpServletRequest);
        chain.doFilter(myrequest,response);
    }

    public void destroy() {

    }

    //自定义request对象，HttpServletRequest的包装类
    class MyRequest extends HttpServletRequestWrapper{
        private HttpServletRequest request;
        //是否编码的标记
        private boolean hasEncode;
        //定义一个可以传入HttpServletRequest对象的构造函数，以便对其进行装饰
        public MyRequest(HttpServletRequest request){
            super(request); //必须
            this.request = request;
        }
        //对需要增强方法，进行覆盖
        @Override
        public Map getParameterMap(){
            //先获得请求方式
            String method = request.getMethod();
            if(method.equalsIgnoreCase("post")){
                //post请求
                try {
                    request.setCharacterEncoding("utf-8");
                    return request.getParameterMap();
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
            }else if(method.equalsIgnoreCase("get")){
                //get请求
                Map<String,String[]> parameterMap=request.getParameterMap();
                if(!hasEncode){ //确保get手动编码逻辑只运行一次
                    for(String parameterName : parameterMap.keySet()){
                        String[] values = parameterMap.get(parameterName);
                        if(values != null){
                            for(int i=0;i<values.length;i++){
                                try {
                                    values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");
                                } catch (UnsupportedEncodingException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                    hasEncode = true;
                }
                return parameterMap;
            }
            return super.getParameterMap();
        }
        //取一个值
        @Override
        public String getParameter(String name){
            Map<String,String[]>parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            if(values == null){
                return null;
            }
            return values[0]; //取回参数的第一个值
        }
        @Override
        public String[] getParameterValues(String name){
            Map<String,String[]> parameterMap = getParameterMap();
            String[] values = parameterMap.get(name);
            return values;
        }
    }
}
